package org.pb.org.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.pb.basic.utils.AjaxResult;
import org.pb.basic.utils.PageList;
import org.pb.org.domain.Department;
import org.pb.org.query.DepartmentQuery;
import org.pb.org.service.IDepartmentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 部门数据对应的请求的控制器
 * 使用restful风格的http请求。查询资源 get 新增资源 post 修改资源 put 删除资源 delete
 * @author
 * @RestController 因为后端只处理数据和返回数据，不进行页面跳转，所以直接使用RestController返回异步请求【json格式数据】
 */
@RestController
@RequestMapping("/department")
@Api(tags = "部门描述", description = "部门详细描述")
public class DepartmentController {

    @Autowired
    private IDepartmentService departmentService;

    /**
     * 获取并返回所有部门数据。
     * 使用GetMapping 对应前端的get请求 【restful】
     * @return 所有部门的数据信息列表
     */
    @GetMapping
    @ApiOperation(value = "查询信息", notes = "获取到部门的所有信息")
    public List<Department> findAll() {
        return departmentService.findAll();
    }

    /** nsd
     * 获取并返回指定id的部门数据
     * 同样是get请求，但是这里需要传递参数，采用springmvc四种取参方式的最后一个，url取参。
     * GetMapping(/{参数名}) 在形参列表中(@PathVariable("参数名") 数据类型 形参名【一般和参数名一致】)
     * 请求映射可以不是GetMapping
     * @return 需要查询的部门的id
     */
    @GetMapping("/{id}")
    @ApiOperation(value = "获取单个信息", notes = "根据id获取到单个部门数据")
    public Department getById(@PathVariable("id") Long id) {
        return departmentService.getById(id);
    }


    /**
     * 根据条件获取到对应的分页数据并返回
     * 因为查询条件偏多，通过url取参不方便，所以采用post数据包形式取参【请求体中】
     * 后端通过RequestBody获取到请求体中的参数，然后封装到query对象中 (@RequestBody DepartmentQuery departmentQuery)
     * @return 部分分页数据列表
     */
    @PostMapping
    @ApiOperation(value = "分页查询", notes = "根据分页信息查询对应的部门数据")
    public PageList<Department> getByQuery(@RequestBody DepartmentQuery departmentQuery) {
        return departmentService.findByQuery(departmentQuery);
    }

    /**
     * 根据id删除对应的部门数据
     * 因为是删除方法，所以使用deleteMapping。
     * 因为只有一个id参数，所以使用url取参的方式
     * @param id 要删除的部门数据的id
     * @return 返回删除操作成功状态和反馈消息
     */
    @DeleteMapping("/{id}")
    @ApiOperation(value = "删除信息", notes = "根据部门id删除对应的部门信息")
    public AjaxResult remove(@PathVariable("id") Long id) {
        try {
            departmentService.remove(id);
            return AjaxResult.successWithMessage("删除成功");
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 因为是修改或者保存数据，所以这里采用PutMapping进行方法映射。
     * 由于传入的参数过多，所以采用请求体传参。
     * 通过requestBody取参
     * @param department 添加或者修改的部门信息
     * @return 保存操作成功状态和反馈信息
     */
    @PutMapping
    @ApiOperation(value = "更新部门信息", notes = "根据参数是否有id值，执行更新。有id为修改对应的部门数据，无id为添加该部门数据")
    public AjaxResult saveOrUpdate(@RequestBody Department department) {
        System.err.println(department);
        try {
            // 如果参数中的id为空，那么就是添加数据
            if (department.getId() == null) {
                departmentService.save(department);
            } else {
                // 如果参数中的id不为空，那么就是修改数据
                departmentService.update(department);
            }
            // 如果没有出现异常，就操作成功
            return AjaxResult.successWithMessage("操作成功");
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 批量删除数据
     * @param ids 前端传入的多个id的数组
     * @return 返回对应的Ajax请求结果
     */
    @PatchMapping
    public AjaxResult batchRemove(@RequestBody List<Long> ids) {
        System.out.println(ids);
        try {
            // 执行批量删除命令
            departmentService.batchRemove(ids);
            // 如果没有发生异常，表示删除成功
            return AjaxResult.successWithMessage("批量操作成功");
        } catch (Exception e) {
            e.printStackTrace();
            // 如果发生异常，表示操作失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 获取到部门对应的部门树
     * @return 一级部门及其子部门数据
     */
    @GetMapping("/getDeptTree")
    @ApiOperation(value = "获取到部门树", notes = "获取到一级部门和其对应的所有下一级子部门的数据")
    public List<Department> getDepartmentTree() {
        return departmentService.findTree();
    }

}
